From: kfraser@localhost.localdomain Date: Mon, 2 Apr 2007 15:51:52 +0000 (+0100) Subject: hvm svm: Clear FS/GS base MSR intercepts. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~15270^2~8 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=8a3970eca45ccd88f0cbc8c2b671c9aa7962d336;p=xen.git hvm svm: Clear FS/GS base MSR intercepts. Signed-off-by: Mats Petersson --- diff --git a/xen/arch/x86/hvm/svm/vmcb.c b/xen/arch/x86/hvm/svm/vmcb.c index 01e3a8b371..9f49815f29 100644 --- a/xen/arch/x86/hvm/svm/vmcb.c +++ b/xen/arch/x86/hvm/svm/vmcb.c @@ -79,6 +79,30 @@ struct host_save_area *alloc_host_save_area(void) return hsa; } +static void disable_intercept_for_msr(char *msr_bitmap, u32 msr) +{ + /* + * See AMD64 Programmers Manual, Vol 2, Section 15.10 (MSR-Bitmap Address). + */ + if ( msr <= 0x1fff ) + { + __clear_bit(msr*2, msr_bitmap + 0x000); + __clear_bit(msr*2+1, msr_bitmap + 0x000); + } + else if ( (msr >= 0xc0000000) && (msr <= 0xc0001fff) ) + { + msr &= 0x1fff; + __clear_bit(msr*2, msr_bitmap + 0x800); + __clear_bit(msr*2+1, msr_bitmap + 0x800); + } + else if ( (msr >= 0xc001000) && (msr <= 0xc0011fff) ) + { + msr &= 0x1fff; + __clear_bit(msr*2, msr_bitmap + 0x1000); + __clear_bit(msr*2+1, msr_bitmap + 0x1000); + } +} + static int construct_vmcb(struct vcpu *v) { struct arch_svm_struct *arch_svm = &v->arch.hvm_svm; @@ -114,6 +138,10 @@ static int construct_vmcb(struct vcpu *v) if ( arch_svm->msrpm == NULL ) return -ENOMEM; memset(arch_svm->msrpm, 0xff, MSRPM_SIZE); + + disable_intercept_for_msr((char *)arch_svm->msrpm, MSR_FS_BASE); + disable_intercept_for_msr((char *)arch_svm->msrpm, MSR_GS_BASE); + vmcb->msrpm_base_pa = (u64)virt_to_maddr(arch_svm->msrpm); vmcb->iopm_base_pa = (u64)virt_to_maddr(hvm_io_bitmap);